const fs = require('fs');
const path = require('path');
const readline = require('readline');


function copyDir(oldDir, newDir) {
  let aocFileList = []
  const files = fs.readdirSync(oldDir)
  files.forEach(file => {
    // 判断是不是目录
    if (fs.statSync(path.resolve(oldDir, file)).isDirectory()) {
      fs.mkdirSync(path.resolve(newDir, file), { recursive: true })

      // 继续拷贝下层目录
      aocFileList = [...aocFileList, ...copyDir(path.resolve(oldDir, file), path.resolve(newDir, file))]
    } else if (file.endsWith('.aoc')) {
      // console.log(file)
      aocFileList.push({
        name: file,
        oldPath: path.resolve(oldDir, file),
        newPath: path.resolve(newDir, file)
      })
    }
  })
  return aocFileList
}

function copyFile(aocFileItem) {
  // 复制文件
  fs.copyFileSync(aocFileItem.oldPath, aocFileItem.newPath);

  // 创建可读流
  const readStream = fs.createReadStream(aocFileItem.newPath, { encoding: 'utf16le' });
  const rl = readline.createInterface({
    input: readStream,
    crlfDelay: Infinity // 识别所有换行符（\n, \r\n）
  });

  let modifiedData = ''; // 用于存储修改后的文件内容
  let stack = 0; // 用于跟踪大括号的嵌套层级
  let inTopLevelBraces = false; // 标记是否在最外层大括号内
  let retainBraces = false; // 标记是否保留当前大括号中的内容
  const retainKeywords = ['ClientAnimationController']; // 需要保留内容的方法名列表

  // 逐行读取文件
  rl.on('line', (line) => {
    // 检查是否进入最外层大括号
    if (line.trim() === '{') {
      stack++;
      if (stack === 1) {
        inTopLevelBraces = true;
        // 检查上一行是否是需要保留的关键字
        const prevLine = modifiedData.split('\n').filter(l => l.trim()).pop();
        if (prevLine && retainKeywords.some(keyword => prevLine.includes(keyword))) {
          retainBraces = true;
        }
        modifiedData += line + '\n'; // 保留最外层大括号
        return;
      }
    }

    // 检查是否退出最外层大括号
    if (line.trim() === '}') {
      stack--;
      if (stack === 0) {
        inTopLevelBraces = false;
        modifiedData += line + '\n'; // 保留最外层大括号
        retainBraces = false; // 重置标记
        return;
      }
    }

    // 如果不在最外层大括号内，或者需要保留当前大括号中的内容，保留该行
    if (!inTopLevelBraces || retainBraces) {
      modifiedData += line + '\n';
    }
  });

  // 当文件读取完成时
  rl.on('close', () => {

    // 将修改后的内容写回文件
    fs.writeFile(aocFileItem.newPath, modifiedData, 'utf16le', (err) => {
      if (err) {
        console.error(`写入文件 ${aocFileItem.newPath} 时出错:`, err);
        return;
      }
      console.log(`文件 ${aocFileItem.newPath} 内容已成功修改并保存。`);
    });
  });
}


module.exports = {
  copyDir,
  copyFile
}